﻿/*=================================================================================*/
/* Esta Classe deverá ser utilizada para a implematação de Funções e Procedimentos */
/* para manipulação de arquivos.                                                   */
/*=================================================================================*/

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using System.Collections;

using ICSharpCode.SharpZipLib.Zip;

namespace Components.Anexo
{
  public class ZipUtility
  {
    public static void ZipFile(string path, int nivel, bool progress, Stream ms)
    {
      //Stream de arquivo compactado.
      using (ZipOutputStream zipStream = new ZipOutputStream(ms))
      {
        //Nível de Compactação: 0 - 9
        zipStream.SetLevel(nivel);

        //Stream de cada arquivo a ser compactado.
        FileStream fs = File.OpenRead(path);

        //Buffer utilizado.
        byte[] buffer = new byte[fs.Length];
        fs.Read(buffer, 0, buffer.Length);
        ZipEntry entry = new ZipEntry(path.Substring(path.LastIndexOf("\\") + 1));
        zipStream.PutNextEntry(entry);

        //Escrita de cada Arquivo no zipStream.
        zipStream.Write(buffer, 0, buffer.Length);
        zipStream.Finish();
        zipStream.Close();
      }
    }

    public static void UnzipFile(string arquivoZip, string path, bool progress)
    {
      try
      {
        using (ZipInputStream zipIStream = new ZipInputStream(File.OpenRead(arquivoZip)))
        {
          ZipEntry entrada = zipIStream.GetNextEntry();
          while (entrada != null)
          {
            string destinoDaEntrada = Path.Combine(@path, Path.GetFileName(entrada.Name));
            int tamanhoDoBuffer = 2048;
            byte[] buffer = new byte[tamanhoDoBuffer];

            string pastaPai = Path.GetDirectoryName(destinoDaEntrada);
            if (!Directory.Exists(pastaPai))
              Directory.CreateDirectory(pastaPai);

            FileStream fs = File.Create(destinoDaEntrada);

            if (entrada.Size > 0)
            {
              do
              {
                tamanhoDoBuffer = zipIStream.Read(buffer, 0, buffer.Length);
                if (tamanhoDoBuffer > 0)
                  fs.Write(buffer, 0, tamanhoDoBuffer);
                else
                  break;
              }
              while (true);
            }

            if (fs != null)
            {
              fs.Flush();
              fs.Close();
            }

            entrada = zipIStream.GetNextEntry();
          }

          if (zipIStream != null)
            zipIStream.Close();
        }
      }
      catch (Exception)
      {
        throw;
      }

    }

    public static bool IsZip(string path)
    {
      try
      {
        using (ZipInputStream zipIStream = new ZipInputStream(File.OpenRead(path)))
        {
          ZipEntry entrada = zipIStream.GetNextEntry();
        }
      }
      catch
      {
        return false;
      }

      return true;
    }
  }
}